package com.sunny.查看对象数据域实际内容;

import com.sunny.common.Employee;

import java.util.ArrayList;

/**
 * 其中ArrayList<Integer>打印了类名和5个元素的类型和值，Employee 打印了类名，
 * 自己定义的3个基本类型的属性的实际值，和父类Person的3个基本类型的属性的实际值
 *
 * 需要注意的是，position，age 是 protected 保护域，salary，hobby 是 private 私有域，
 * Java的安全机制只允许查看任意对象有哪些域，但是不允许读取它们的值
 *
 * 程序中是通过 AccessibleObject.setAccessible(fields, true) 将域设置为了可访问，
 * 取消了Java的执行访问检查，因此可以访问，如果不加会报异常 IllegalAccessException
 *
 * 小结一下，我们通过 setAccessible(true) 绕过了Java执行访问检查，因此能够访问私有域
 * ，通过 Field.getType() 获得了属性的声明类型，通过了 Field.get(Object obj)
 * 获得了该域属性的实际值，
 * 还有一个没用上的 Field.set(Object obj, Object value) 设置域属性的实际值
 */
public class ObjectAnalyzerTest {
    public static void main(String[] args) {
        int size = 4;
        ArrayList<Integer> squares = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            squares.add(i * i);
        }
        ObjectAnalyzer objectAnalyzer = new ObjectAnalyzer(); // 创建一个上面定义的分析类ObjectAnalyzer的对象
        System.out.println(objectAnalyzer.toString(squares)); // 分析ArrayList<Integer>对象的实际值

        Employee employee = new Employee("小明", "18", "爱好写代码", 1, "Java攻城狮", 100); // 分析自定义类Employee的对象的实际值
        System.out.println(objectAnalyzer.toString(employee));
    }
}
